package com.hh.hot100;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @Author hanghao
 * @Date 2023/6/26 11:51
 * @Version 1.0
 * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
 *
 * 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
 */

public class No49 {
    public static void main(String[] args) {
        String[] strs = new String[]{"eat", "tea", "tan", "ate", "nat", "bat"};
        List<List<String>> lists = groupAnagrams(strs);
        for (List<String> list : lists) {
            System.out.println(list);
        }
    }
    public static List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String, List<String>> map = new HashMap<>();
        for(String str: strs) {
            int[] record = new int[26];
            for(int i = 0; i < str.length(); i++) {
                record[str.charAt(i) - 'a']++;
            }
            StringBuilder stringBuilder = new StringBuilder();
            for(int i = 0; i < record.length; i++) {
                stringBuilder.append(record[i]);
                stringBuilder.append((char)('a' + i));
            }
            String key = stringBuilder.toString();
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key,list);
        }
        return new ArrayList<List<String>>(map.values());
    }

//二刷
//    public static List<List<String>> groupAnagrams(String[] strs) {
//        HashMap<String, List<String>> map = new HashMap<>();
//        for (String str : strs) {
//            int[] ints = new int[26];
//            for (int i = 0; i < str.length(); i++) {
//                ints[str.charAt(i) - 'a']++;
//            }
//            StringBuilder stringBuilder = new StringBuilder();
//            for (int i = 0; i < ints.length; i++) {
//                stringBuilder.append(ints[i]);
//                stringBuilder.append((char) ('a' + i));
//            }
//            String key = stringBuilder.toString();
//            List<String> list = map.getOrDefault(key, new ArrayList<String>());
//            list.add(str);
//            map.put(key,list);
//        }
//        return new ArrayList<List<String>>(map.values());
//    }


}
